<?php

class Materials_TestController extends Zend_Controller_Action {

    function init() {

        //загружаем модуль каталог
        Workset_Module::loadModule('materials');

		parent::init();
	}

    function materialAction() {
        $this->_helper->viewRenderer->setNoRender(true);

        $category = Materials_Model_Category::create(array(
            'name' => 'category 1'
        ));

        exprTest(0 < ($categoryId = $category->save()), null, "Сохранение нового объекта ".get_class($category));

        $material = Materials_Model_Material::create(array(
            'content' => 'material 1 full content',
            'preview' => 'material 1 preview',
        ));

		exprTest($material->getContent() == 'material 1 full content', null, "Содержимое материала");

        exprTest(0 < ($materialId = $material->save()), null, "Сохранение нового объекта ".get_class($material));

        exprTest(false != $material->addCategory($category)->updateData(), null, "Привязка материала к категории");

        $category = Materials_Model_Category::getInstance($categoryId);

        exprTest($category->getMaterialsCount() == 1, null, "Число материалов в категории ".get_class($category));
        exprTest($category->getDepth() == 0, null, "Уровень вложенности категории ".get_class($category));

        $category->setData(array(
            'name' => 'new name'
        ));

        exprTest(0 < $category->save(), null, "Изменение нового объекта ".get_class($category));

        $material = Materials_Model_Material::getInstance($materialId);

        $material->setData(array(
            'content' => new Materials_Model_Material_Block('new content'),
            'preview' => 'new preview',
			'serialize' => 1
        ));

        exprTest($material->isContentSerialized(), null, "Хранить сериализованный объект");
		
		exprTest(0 < $material->save(), null, "Изменение нового объекта ".get_class($material));

        exprTest($material->getContent() instanceof Materials_Model_Material_Block, null, "Инициализация объекта контента");

        exprTest(false != $material->deleteCategory($category)->updateData(), null, "Удаление матегориала из категории");

        $category = Materials_Model_Category::getInstance($categoryId);

        exprTest($category->getMaterialsCount() == 0, null, "Число материалов в категории ".get_class($category));

        exprTest(0 < $category->delete(), null, "Удаление категории");

        exprTest(0 < $material->delete(), null, "Удаление метериала");

    }

    function iterateAction() {
        $this->_helper->viewRenderer->setNoRender(true);

        $material = Materials_Model_Material::create(array(
            'content' => 'material 1 full content',
            'preview' => 'material 1 preview',
        ));

        try {
            $it = $material->getIterator();
            
        } catch (Workset_Model_Exception $e) {
            exprTest(true, null, $e->getMessage());
        }

        try {
            $material['content'] = new Materials_Model_Material_Block('new content');
            $it = $material->getIterator();

        } catch (Workset_Model_Exception $e) {
            exprTest(true, null, $e->getMessage());
        }

        try {

            $material->setData(array(
                'content' => new Materials_Model_Material_Block('new content'),
                'serialize' => true
            ));

            $it = $material->getIterator();

            exprTest($it instanceof Materials_Model_Material_Block, null, "Итератор для объекта контента");

        } catch (Workset_Model_Exception $e) {
            exprTest($e->getMessage(), null, $e->getMessage());
        }

        try {

            $block = new Materials_Model_Material_Block();
            $block->addBlock('one', 'my first block');
            $block->addBlock('two', 'my second block');
            $block->addBlock('three', array(
                'sub_one' => new Materials_Model_Material_Block(array(
                    'sub_sub_one' => '1',
                    'sub_sub_two' => '2',
                )),
                'sub_two' => 'my sub second',
            ));

            $material->setData(array(
                'content' => $block,
                'serialize' => true
            ));

            $recIt = new RecursiveIteratorIterator($material->getIterator(), RecursiveIteratorIterator::CHILD_FIRST);

            $test = array();

            foreach ($recIt as $key => $item) {
                $test[] = $key;
            }

            exprTest($test === array(

                'one', 'two', 'sub_sub_one', 'sub_sub_two', 'sub_one', 'sub_two', 'three'

            ), null, "Рекурсивный итератор для объекта контента");

            exprTest($material->getIterator()->toArray() === array(
                "one" => "my first block",
                "two" => "my second block",
                "three" => array(
                    "sub_one" => array(
                        "sub_sub_one" => "1",
                        "sub_sub_two" => "2",
                    ),
                    "sub_two" => "my sub second"
                )
            ), null, "Метод toArray() объекта контента");

        } catch (Workset_Model_Exception $e) {
            exprTest($e->getMessage(), null, $e->getMessage());
        }

    }

    function commentAction() {
        $this->_helper->viewRenderer->setNoRender(true);

        $material = Materials_Model_Material::create(array(
            'title' => 'test comments',
        ));
        $material->save();

        $comments = $material->getComments();
        exprTest($comments->count() == 0, null, 'Комментариев нет');

        $msg = 'comment 1';
        $comment = Materials_Model_Comment::create(array(
            'message' => $msg
        ));
        exprTest($comment->getId() == 0, null, 'Создание нового комментария');

        $comment->setMaterial($material);
        exprTest($comment->getMaterial()->getId() == $material->getId(), null, 'Материал');

        $id = $comment->save();
        exprTest($id > 0, null, 'ID сохраненного комментария');

        $comments = $material->getComments();
        exprTest($comments->count() == 1 && $comments->current()->getId() == $id, null, 'Новый комментарий у материала');
        exprTest($comments->current()->getMessage() == $msg, null, 'Содержимое комментария');

        $msg1 = 'reply 1 to comment 1';
        $msg2 = 'reply 2 to comment 1';
        $answer1 = Materials_Model_Comment::create(array(
            'message' => $msg1
        ));
        $answer2 = Materials_Model_Comment::create(array(
            'message' => $msg2
        ));

        $comment->addComment($answer1);
        $comment->addComment($answer2);
        $comment->save();
        exprTest($comment->getAnswersCount() == 2, null, 'Число ответов на комментарий');

        $answers = $comment->getAnswers();
        exprTest($answers->count() == $comment->getAnswersCount(), null, 'Число ответов на комментарий');

        foreach ($answers as $answer) {
            $answer->setData(array(
                'message' => $answer->getMessage() . ' EDIT'
            ));
            $answer->save();
        }

        $answers = $comment->getAnswers();

        foreach ($answers as $answer) {
            exprTest($answer->getMessage(), null, 'Редактирование сообщения');
            $answer->delete();
        }

        $comments = $material->getComments();
        exprTest($comments->count() == 1, null, 'Число комментариев после удаления ответов');
        exprTest($comments->current()->hasAnswers() === false, null, 'Число ответов на комментарий');

        $material->delete();
        $comments = Materials_Model_Comment::getAll();
        exprTest($comments->count() == 0, null, 'При удалении материала удаляются комментарии к нему');

    }

}

?>